package com.danciyixue.boot.common.util;

import java.util.Objects;
import java.util.function.Consumer;
import java.util.function.Supplier;

/**
 * Bean属性复制工具类
 * 提供非空字段复制的通用方法，避免重复的if-else判断
 *
 * @author youlaitech
 * @since 2025-06-29
 */
public class BeanCopyUtils {

    /**
     * 通用的非空字段复制方法
     * 如果getter返回的值不为null，则调用setter设置值
     *
     * @param getter 获取值的方法引用
     * @param setter 设置值的方法引用
     * @param <T>    字段类型
     */
    public static <T> void copyIfNotNull(Supplier<T> getter, Consumer<T> setter) {
        T value = getter.get();
        if (Objects.nonNull(value)) {
            setter.accept(value);
        }
    }

    /**
     * 批量复制非空字段
     * 使用可变参数接收多个复制操作
     *
     * @param copyOperations 复制操作的Runnable数组
     */
    public static void copyNonNullFields(Runnable... copyOperations) {
        for (Runnable operation : copyOperations) {
            operation.run();
        }
    }

    /**
     * 创建一个复制操作的Runnable
     * 便于与copyNonNullFields方法配合使用
     *
     * @param getter 获取值的方法引用
     * @param setter 设置值的方法引用
     * @param <T>    字段类型
     * @return 复制操作的Runnable
     */
    public static <T> Runnable createCopyOperation(Supplier<T> getter, Consumer<T> setter) {
        return () -> copyIfNotNull(getter, setter);
    }
}
